/**
 *
 * XYkeep 通用方法
 * @author 湖南行云网络科技有限公司
 *
 **/

import http_config, { image_url } from '../config/http';
import store from '../store';
class xyfun {

	/**
	 * 获取http配置信息
	 */
	http_config(name){
		return http_config[name];
	}

	/**
	 * 页面返回
	 */
	back(tips = '',num = 1){
		if(tips != ''){
		this.msg(tips);
			setTimeout(()=>{
				uni.navigateBack({
					delta: num
				});
			},3000)
		}else{
			uni.navigateBack({
				delta: num
			});
		}

	}

	/**
	 * 图片处理
	 */
	image(url){
		if(!(/^(http|https):\/\/.+/.test(url))){
			url = http_config.image_url + url;
		}
		return url;
	}


	//scene解码
	sceneDecode(e) {
		var scene = decodeURIComponent(e),params = scene.split(','),data = {};
		for (var i in params) {
		   var val = params[i].split(':');
		   val.length > 0 && val[0] && (data[val[0]] = val[1] || null)
		}
		return data;
	}

	/**
	 * 提示信息
	 */
	msg(title, duration = 2000, icon = 'none'){
		uni.showToast({title,duration,icon});
	}

	/**
	 * 时间格式化
	 */
	timeFormat(timestamp = null, fmt = 'yyyy-mm-dd hh:MM:ss'){
		// 其他更多是格式化有如下:
		// yyyy:mm:dd|yyyy:mm|yyyy年mm月dd日|yyyy年mm月dd日 hh时MM分等,可自定义组合
		timestamp = parseInt(timestamp);
		// 如果为null,则格式化当前时间
		if (!timestamp) timestamp = Number(new Date());
		// 判断用户输入的时间戳是秒还是毫秒,一般前端js获取的时间戳是毫秒(13位),后端传过来的为秒(10位)
		if (timestamp.toString().length == 10) timestamp *= 1000;
		let date = new Date(timestamp);
		let ret;
		let opt = {
			"y+": date.getFullYear().toString(), // 年
			"m+": (date.getMonth() + 1).toString(), // 月
			"d+": date.getDate().toString(), // 日
			"h+": date.getHours().toString(), // 时
			"M+": date.getMinutes().toString(), // 分
			"s+": date.getSeconds().toString() // 秒
		};
		for (let k in opt) {
			ret = new RegExp("(" + k + ")").exec(fmt);
			if (ret) {
				fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
			};
		};
		return fmt;
	}

	/**
	 * 将时间戳转化为时分秒的格式，用作倒计时
	 */
	intervalTime(endTime) {
		// console.log(222)
		// var timestamp=new Date().getTime(); //计算当前时间戳
		var date1 = (Date.parse(new Date()))/1000;//计算当前时间戳 (毫秒级)
		var date2 = endTime; //结束时间
		// var date3 = date2.getTime() - date1.getTime(); //时间差的毫秒数
		var date3 =  (date2- date1)*1000; //时间差的毫秒数
		//计算出相差天数
		var days = Math.floor(date3 / (24 * 3600 * 1000));
		//计算出小时数

		var leave1 = date3 % (24 * 3600 * 1000); //计算天数后剩余的毫秒数
		var hours = Math.floor(leave1 / (3600 * 1000));
		//计算相差分钟数
		var leave2 = leave1 % (3600 * 1000); //计算小时数后剩余的毫秒数
		var minutes = Math.floor(leave2 / (60 * 1000));

		//计算相差秒数

		var leave3 = leave2 % (60 * 1000); //计算分钟数后剩余的毫秒数
		var seconds = Math.round(leave3 / 1000);
	    // console.log(days + "天 " + hours + "小时 ")
		var sun = days*24 + hours;
		var min = minutes;
		var sec = seconds;
		if(sun == 0){
			sun = '00';
		}else if(sun < 10){
			sun = '0'+sun;
		}
		if(min < 10){
			min = '0'+minutes;
		}
		if(sec < 10){
			sec = '0'+seconds;
		}

		if((days*24 + hours)<= 0 && minutes <= 0 && seconds <= 0){
			return '00:00:00'
		}else{
			return   (sun) + ":" + min + ":" + sec;
		}

		// return   days + "天 " + hours + "小时 "

	}



	/**
	 * 获取当前页面栈
	 */
	prePage(){
		let pages = getCurrentPages();
		let prePage = pages[pages.length - 2];
		// #ifdef H5
		return prePage;
		// #endif
		return prePage.$vm;
	}


	/**
	 * 跳转登录页面
	 */
	toLogin(){
		this.to('/pages/user/login');
	}

	/**
	 * 页面跳转
	 */
	to(url, isTab = false, animationType = 'pop-in', animationDuration = 300){

		if(isTab == false && this.isTabbar(url)){
			isTab = true;
		}

		if(isTab){
			uni.switchTab({
				url:url
			})
		}else{
			uni.navigateTo({
				url,
				animationType,
				animationDuration
			})
		}
	}

	/**
	 * 是否Tabbar 页面
	 */
	isTabbar(url){
		var tablist = [
			'/pages/index',
			'/pages/coach',
			'/pages/shop',
			'/pages/user',
		];

		return tablist.indexOf(url) != -1
	}

	/**
	 * 系统屏幕参数
	 */
	xysys() {
		var sys = uni.getSystemInfoSync();

		let buttonBound = {
			bottom: 56,
			height: 32,
			left: 320,
			right: 407,
			top: 24,
			width: 87
		};
		// #ifdef MP-WEIXIN
		buttonBound = wx.getMenuButtonBoundingClientRect();
		// #endif
		var data = {
			top: buttonBound.top + buttonBound.height,
			buttonBoundRight : sys.screenWidth - buttonBound.left,
			height: sys.statusBarHeight + uni.upx2px(80),
			screenHeight: sys.screenHeight,
			platform: sys.platform,
			model: sys.model,
			windowHeight: sys.windowHeight,
			windowBottom: sys.windowBottom,
			clientHeight: sys.windowHeight-uni.upx2px(80)-sys.statusBarHeight,
			deviceId: sys.deviceId,
			safeAreaInsets:sys.safeAreaInsets,
			buttonBound : buttonBound
		};
		return data;
	}


	// rpx转px
	rpxToPx(rpx) {
		const screenWidth = uni.getSystemInfoSync().screenWidth
		return (screenWidth * Number.parseInt(rpx)) / 750
	}

	// px转rpx
	pxToRpx(px) {
		const screenWidth = uni.getSystemInfoSync().screenWidth
		return (750 * Number.parseInt(px)) / screenWidth
	}

	/**
	 * 分享配置
	 */

	shareConfig(){
		return store.state.common.shareConfig;
	}

	/**
	 * 通用配置
	 */
	config(){
		return store.state.common.appConfig;
	}

	/**
	 * tabbar 数据
	 */
	tabBarData(){
		return store.state.common.tabBarList;
	}


	/**
	 * 复制
	 */
	copy(text){
		uni.setClipboardData({
			data:text
		})
	}


	/**
	 * 拨打电话
	 */
	phone(num){
		uni.makePhoneCall({
			phoneNumber:num,
		})
	}

	/**
	 * 获取用户定位经纬度
	 */
	loc() {
		return new Promise((resolve, reject) => {
			uni.getStorage({
				key: 'user:loc',
				success: function(res) {
					resolve(res.data);
				},
				fail: function() {
					uni.getLocation({
						type: 'wgs84',
						success: function(res) {
							uni.setStorage('user:loc',res);
							resolve(res);
						},
						fail: function(res) {
							reject(res);
						}
					});
				}
			});
		})
	}

	/*
	 * 只显示定位城市的部分
	 */
	locCity(str){

		const regex = /省([^\d\s]+市)/;

		// 使用正则表达式提取匹配的城市名
		const match = str.match(regex);

		if (match) {
			return match[1]+'...';
		} else {
			return str;
		}
	}

	/**
	 * 打开设置
	 */
	oset(){
		return new Promise((resolve, reject) => {
			uni.openSetting({
				success: (res) => {
					if (res.authSetting['scope.userLocation']) {
						resolve(res);
					} else {
						reject(res)
					}
				},
				fail: (err) => {
					reject(err)
				}
			})
		})
	}

	//教练星级
	coachScore(score){
		if(score >4){
			return '五星教练';
		}
		if(score >3){
			return '四星教练';
		}
		if(score >2){
			return '三星教练';
		}
		if(score >1){
			return '二星教练';
		}
		return '一星教练';
	}

	//距离格式化
	distance(num,isNum = false){

		var a = (num/1000).toFixed(1);

		if(!a){
			a = 0;
		}

		if(isNum){
			return a+'km';
		}
		return '距离'+a+'km';
	}

	//斜杠拼接数组
	slashSplice(arr){
		return arr.join('/');
	}

	//标签拆分成数组
	tagsSplit(str){
		console.log(str)
		return str.split(',');
	}

	// 多张图片预览
	pi(index,photoList) {
		uni.previewImage({
			current: index,
			urls: photoList,
			loop:true,
		})
	}

	//经纬度计算距离
	algorithm (point1, point2) {

		//经纬度：113.08514 , 27.83180

		let [x1, y1] = point1;
		let [x2, y2] = point2;
	    let Lat1 = this.rad(x1); // 纬度
	    let Lat2 = this.rad(x2);
	    let a = Lat1 - Lat2;//	两点纬度之差
	    let b = this.rad(y1) - this.rad(y2); //	经度之差
	    let s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2)
	        	+ Math.cos(Lat1) * Math.cos(Lat2) * Math.pow(Math.sin(b / 2), 2)));
	        //	计算两点距离的公式
	    s = s * 6378137.0;//	弧长等于弧度乘地球半径（半径为米）
	    s = Math.round(s * 10000) / 10000;//	精确距离的数值
	    return s;

	}

	//角度转换成弧度
	rad(d){
	    return d * Math.PI / 180.00;
	};

	//价格简化显示
	pe(price){
		return price.replace(".00","")
	}

	//价格完整显示
	pea(x) {
	  var f = parseFloat(x);
	  if (isNaN(f)) {
		return false;
	  }
	  var f = Math.round(x * 100) / 100;
	  var s = f.toString();
	  var rs = s.indexOf(".");
	  if (rs < 0) {
		rs = s.length;
		s += ".";
	  }
	  while (s.length <= rs + 2) {
		s += "0";
	  }
	  return s;
	}

	//导航
	openLoc(latitude,longitude,name,address){
		uni.openLocation({
			latitude:parseFloat(latitude),
			longitude:parseFloat(longitude),
			name:name,
			address:address
		})
	}


	/**
	 * 加法精度计算
	 */
	bcadd(a, b){
	    var c, d, e;
	    try {
	        c = a.toString().split(".")[1].length
	    } catch(f) {
	        c = 0
	    }
	    try {
	        d = b.toString().split(".")[1].length
	    } catch(f) {
	        d = 0
	    }
	    return e = Math.pow(10, Math.max(c, d)),(this.bcmul(a, e) + this.bcmul(b, e)) / e
	}

	/**
	 * 减法精度计算
	 */
	bcsub(a, b){
	    var c, d, e;
	    try {
	        c = a.toString().split(".")[1].length
	    } catch(f) {
	        c = 0
	    }
	    try {
	        d = b.toString().split(".")[1].length
	    } catch(f) {
	        d = 0
	    }
	    return e = Math.pow(10, Math.max(c, d)),(this.bcmul(a, e) - this.bcmul(b, e)) / e
	}

	/**
	 * 乘法精度计算
	 */
	bcmul(a, b){
	    var c = 0,
	    d = a.toString(),
	    e = b.toString();
	    try {
	        c += d.split(".")[1].length
	    } catch(f) {}
	    try {
	        c += e.split(".")[1].length
	    } catch(f) {}
	    return Number(d.replace(".", "")) * Number(e.replace(".", "")) / Math.pow(10, c)
	}

	/**
	 * 除法精度计算
	 */
	bcdiv(a, b){
	    var c, d, e = 0,
	    f = 0;
	    try {
	        e = a.toString().split(".")[1].length
	    } catch(g) {}
	    try {
	        f = b.toString().split(".")[1].length
	    } catch(g) {}
	    return c = Number(a.toString().replace(".", "")),d = Number(b.toString().replace(".", "")),this.bcmul(c / d, Math.pow(10, f - e))
	}

	/*
	 * 根据年段筛选出相关的年级
	 */
	grade_by_age_rang(gradeData,age_rang_id){
		let newGrade = [];
		for(let i=0; i<gradeData.length; i++){
			if(gradeData[i].age_range_id==age_rang_id){
				newGrade.push(gradeData[i]);
			}
		}
		return newGrade;
	}

	/*
	 * 根据年级筛选出年段
	 */
	age_range_by_grade(ageData,grade_id){
		let age_range = '';
		for(let i=0; i<ageData.length; i++){
			if(ageData[i].id==grade_id){
				age_range = ageData[i];
			}
		}
		return age_range;
	}

	/*
	 * 根据当前选中年级排除掉无关的科目，如果输出的科目列表不存在当前选中的科目，要提示把科目重置选择
	 * subjectData 全局科目列表
	 * grade_id 选中的年级
	 * subject_id 当前选中的科目
	 *
	 */
	subject_by_grade(subjectData,grade_id,subject_id){
		let newSubject = [];
		let valArr = [];
		let finded = false;
		let subject_id_finded = false;
		let subject_key = '';
		for(let i=0;i<subjectData.length;i++){
			valArr = (subjectData[i].grade_ids).split(',');
			finded = valArr.some(str => str==grade_id);
			if(finded){
				if(subjectData[i].id == subject_id){
					subject_id_finded = true;
					subject_key = newSubject.length;
				}
				newSubject.push(subjectData[i]);
			}
		}
		return {
			subject_list : newSubject,//重新渲染的科目列表
			subject_id_finded : subject_id_finded,//重新渲染的科目列表里面是否包含之前的科目
			subject_key : subject_key,//科目重新渲染的键，如果有的话
		};
	}

	get_file_extension(url) {
		// 使用正则表达式提取文件扩展名
		const match = url.match(/\.([a-zA-Z0-9]+)$/);
		if (match) {
			return match[1];  // 返回扩展名
		} else {
			return null;  // 如果没有找到扩展名
		}
	}


	//获取经纬度
	getLatLng(must=true){
		var that = this;
		let lat = uni.getStorageSync('lat');
		let lng = uni.getStorageSync('lng');
		if(!lat || !lng){
			if(must){
				uni.showModal({
					title:'请授权位置信息',
					confirmText: '去授权',
					success(res) {
						if(res.confirm){
							uni.chooseLocation({
								success: res => {
									uni.setStorageSync('addr',res.address + res.name)
									uni.setStorageSync('lat',res.latitude)
									uni.setStorageSync('lng',res.longitude)

									//小程序和微信的页面栈原理不一样
									let pages = getCurrentPages();
									let prePage;
									// #ifdef H5
									prePage = pages[pages.length - 2];
									// #endif
									// #ifdef MP-WEIXIN
									prePage = pages[pages.length - 1];
									prePage = prePage.$vm;
									// #endif
									prePage.refreshLatLng(res.latitude,res.longitude,res.address + res.name);
								},
								fail: err => {

								}
							});
						}
					}
				})
			}
			return {
				default : true,
				lat : store.state.common.customConfig.map_center_lat,
				lng : store.state.common.customConfig.map_center_lng,
			}
		}else{
			return {
				default: false,
				lat : lat,
				lng : lng
			}
		}
	}

	//将数据绘制成坐标
	point_draw(data){
		let points = [];
		let point = {};
		for(let i=0;i<data.length;i++){
			point = {
				id: i,
				latitude: data[i].lat,
				longitude: data[i].lng,
				title: data[i].title,
				number: i,
				width: 30,
				height: 30,
				iconPath: '/static/images/point.png',
				display: 'ALWAYS',
				customCallout: {
					anchorY: 0.5,
					anchorX: 0.5,
					display: "ALWAYS"
				},
				anchor: {
					x: 0.5,
					y: 0.5
				},
				label : {
					content: String(i+1),
					color: '#fff',//文本颜色
					fontSize:12,//文字大小
					textAlign:"center",//文本对齐方式。有效值: left, right, center
					anchorX : 8,
					anchorY : -15,
				}
			}
			points.push(point);
		}
		let lat = uni.getStorageSync('lat');
		let lng = uni.getStorageSync('lng');
		if(lat && lng){
			point = {
				id: 999,
				latitude: lat,
				longitude: lng,
				title: '当前地址',
				number: 999,
				width: 30,
				height: 30,
				iconPath: '/static/images/local.png',
				display: 'ALWAYS',
			}
			points.push(point);
		}
		return points;
	}

	get_today(){
		// 创建当前时间的 Date 对象
		const now = new Date();

		// 获取各个部分
		const year = now.getFullYear();      // 2024
		const month = now.getMonth() + 1;    // 1-12 (注意：getMonth() 返回 0-11)
		const date = now.getDate();          // 1-31
		const day = now.getDay();            // 0-6 (0代表星期日)

		return `${year}-${month}-${date}`; // 2024-12-19
	}

}
export default new xyfun();
